volatile unsigned char rxb[256], rxc=0, prxc=0; unsigned char serial_available(void) { if(prxc!=rxc) { return(1); } else { return(0); } } unsigned char serial_read(void) //blocking { while(prxc==rxc); //If you always call and test for serial_available before reading this can be removed return(rxb[prxc++]); } unsigned char serial_read(unsigned char *b) //nonblocking { if(prxc!=rxc) { *b=rxb[prxc++]; return(1); } else { return(0); } } ISR(USART_RX_vect) { rxb[rxc]=UDR0; rxc+=1; }